/*
 * @Descripttion:
 * @version:
 * @Author: xj
 * @Date: 2024-11-11 11:12:43
 * @LastEditors: xj
 * @LastEditTime: 2024-11-12 14:17:06
 */
import { autoUpdater } from 'electron-updater'
import { ipcMain, BrowserWindow } from 'electron'
import { UpdateCode } from '/@/enums/channelEnum'
import { join } from 'path'

// 负责向渲染进程发送信息
function sendUpdateMsg(mainWindow: BrowserWindow, code: number, channel = 'update:msg', data?: string | number) {
  const sendData = {
    code,
    msg: data || ''
  }
  console.log(channel, sendData, 'send')
  mainWindow.webContents.send(channel, sendData)
}

export function setupUpdater(mainWindow: BrowserWindow) {
  // 开启开发环境调试
  autoUpdater.forceDevUpdateConfig = true

  // 默认会自动下载新版本，如果不想自动下载，设置为 false
  autoUpdater.autoDownload = false

  if (import.meta.env.DEV) {
    let filepath = join(process.cwd(), 'dev-app-update.yml')
    autoUpdater.updateConfigPath = filepath
  }

  // 设置检测更新的地址
  // autoUpdater.setFeedURL({
  //   provider: 'generic',
  //   url: 'http://loclhost:8848/static'
  // })

  // 监听'error'事件，当更新发生错误时触发
  autoUpdater.on('error', (err) => {
    let msg = ''
    if (err.message.includes('sha512 checksum mismatch')) {
      msg = 'sha512校验失败'
    } else {
      msg = err.message
    }
    sendUpdateMsg(mainWindow, UpdateCode.ERROR, msg)
  })

  // 当开始检查更新的时候触发
  autoUpdater.on('checking-for-update', () => {
    console.log('正在检查更新...')
    sendUpdateMsg(mainWindow, UpdateCode.CHECKING)
  })

  // 发现可更新数据时触发
  autoUpdater.on('update-available', () => {
    console.log('检测到新版本')
    sendUpdateMsg(mainWindow, UpdateCode.NEW)
  })

  // 没有可更新数据时触发
  autoUpdater.on('update-not-available', () => {
    console.log('未检测到新版本')
    sendUpdateMsg(mainWindow, UpdateCode.OLD)
  })

  // 监听下载进度
  autoUpdater.on('download-progress', (progress) => {
    console.log('下载进度', progress)
    sendUpdateMsg(mainWindow, UpdateCode.DOWNLOADING, 'app:download-progress', progress.percent)
  })

  // 新版本下载完成时触发
  autoUpdater.on('update-downloaded', () => {
    console.log('新版本下载完成')
    sendUpdateMsg(mainWindow, UpdateCode.DOWNLOADED)
  })

  // 执行更新检查
  ipcMain.handle('app:checkForUpdates', () => {
    console.log('检查更新')
    autoUpdater.checkForUpdates()
  })

  // 退出并安装
  ipcMain.handle('app:quitAndInstall', () => {
    autoUpdater.quitAndInstall()
  })

  // 手动下载更新文件
  ipcMain.handle('app:downloadUpdate', () => {
    autoUpdater.downloadUpdate()
  })
}
